#ifndef ENGINE_SENSE_H
#define ENGINE_SENSE_H


#include <string>
#include "SDL.h"

namespace Engine { class Backbone; } 

namespace Engine {

//Senses things that happens on system
class Sense {
  public:
	Sense(std::string context = ""); 
	virtual ~Sense(); 
	inline virtual void inputFocus(); 
	inline virtual void inputBlur(); 
	inline virtual void keyDown(SDLKey sym, SDLMod mod, Uint16 unicode); 
	inline virtual void keyUp(SDLKey sym, SDLMod mod, Uint16 unicode); 
	inline virtual void mouseFocus(); 
	inline virtual void mouseBlur(); 
	inline virtual void mouseMove(int mX, int mY, int relX, int relY, bool Left, bool Right, bool Middle); 
	inline virtual void mouseWheel(bool Up, bool Down); 
	inline virtual void lButtonDown(int mX, int mY); 
	inline virtual void lButtonUp(int mX, int mY); 
	inline virtual void rButtonDown(int mX, int mY); 
	inline virtual void rButtonUp(int mX, int mY); 
	inline virtual void mButtonDown(int mX, int mY); 
	inline virtual void mButtonUp(int mX, int mY); 
	inline virtual void joyAxis(Uint8 which, Uint8 axis, Sint16 value); //Not implemented
	inline virtual void joyButtonDown(Uint8 which, Uint8 button); 
	inline virtual void joyButtonUp(Uint8 which, Uint8 button); 
	inline virtual void joyHat(Uint8 which, Uint8 hat, Uint8 value); 
	inline virtual void joyBall(Uint8 which, Uint8 ball, Sint16 xrel, Sint16 yrel); 
	inline virtual void minimize(); 
	inline virtual void restore(); 
	inline virtual void resize(int w, int h); 
	inline virtual void expose(); 
	inline virtual void exit() = 0; 
	virtual void user(Uint8 type, int code, void * data1, void * data2); 
	static Uint8 * keyState; 

  private:
	std::string context; 
};
inline void Sense::inputFocus() {

	//Pure virtual, do nothing
}

inline void Sense::inputBlur() {

	//Pure virtual, do nothing
}

inline void Sense::keyDown(SDLKey sym, SDLMod mod, Uint16 unicode) {

	//Pure virtual, do nothing
}

inline void Sense::keyUp(SDLKey sym, SDLMod mod, Uint16 unicode) {

	//Pure virtual, do nothing
}

inline void Sense::mouseFocus() {

	//Pure virtual, do nothing
}

inline void Sense::mouseBlur() {

	//Pure virtual, do nothing
}

inline void Sense::mouseMove(int mX, int mY, int relX, int relY, bool Left, bool Right, bool Middle) {

	//Pure virtual, do nothing
}

inline void Sense::mouseWheel(bool Up, bool Down) {

	//Pure virtual, do nothing
}

//Not implemented

inline void Sense::lButtonDown(int mX, int mY) {

	//Pure virtual, do nothing
}

//Not implemented

inline void Sense::lButtonUp(int mX, int mY) {

	//Pure virtual, do nothing
}

//Not implemented

inline void Sense::rButtonDown(int mX, int mY) {

	//Pure virtual, do nothing
}

//Not implemented

inline void Sense::rButtonUp(int mX, int mY) {

	//Pure virtual, do nothing
}

//Not implemented

inline void Sense::mButtonDown(int mX, int mY) {

	//Pure virtual, do nothing
}

//Not implemented

inline void Sense::mButtonUp(int mX, int mY) {

	//Pure virtual, do nothing
}

//Not implemented
inline void Sense::joyAxis(Uint8 which, Uint8 axis, Sint16 value) {

	//Pure virtual, do nothing
}

inline void Sense::joyButtonDown(Uint8 which, Uint8 button) {

	//Pure virtual, do nothing
}

inline void Sense::joyButtonUp(Uint8 which, Uint8 button) {

	//Pure virtual, do nothing
}

inline void Sense::joyHat(Uint8 which, Uint8 hat, Uint8 value) {

	//Pure virtual, do nothing
}

inline void Sense::joyBall(Uint8 which, Uint8 ball, Sint16 xrel, Sint16 yrel) {

	//Pure virtual, do nothing
}

inline void Sense::minimize() {

	//Pure virtual, do nothing
}

inline void Sense::restore() {

	//Pure virtual, do nothing
}

inline void Sense::resize(int w, int h) {

	//Pure virtual, do nothing
}

inline void Sense::expose() {

	//Pure virtual, do nothing
}


} // namespace Engine
#endif
